home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 23 / Amiga Format AFCD23 (Feb 1998, Issue 107).iso / -in_the_mag- / emulation / filesystem / 1541 / speed.c < prev   
C/C++ Source or Header  |  1997-12-12  |  4KB  |  145 lines

  1. ;/*
  2. sc DisAsm=ram:speed.s math=standard NoCheckAbort speed.c ProgramName=speed ObjectName=ram: Ignore=73+306 GST=include:all.gst GSTImm NoIcon NoStackCheck UnsignedChar Parm=Register Opt OptSched OptInLocal OptDep=100 OptRDep=100 CommentNest Link
  3. quit
  4. */
  5.  
  6. /*
  7. Disk speed checker
  8.  
  9. Compiled with SAS/C V6.51
  10. */
  11.  
  12. WORD AbleICR(long mask);
  13. WORD SetICR(long mask);
  14. #pragma libcall CiaBase AbleICR 12 001
  15. #pragma libcall CiaBase SetICR 18 001
  16.  
  17. /* Command line parsing */
  18. enum cmdargs { DRIVE, NUMARGS };
  19. static struct RDArgs *rdargs;
  20. static LONG args[NUMARGS];
  21.  
  22. /* Misc */
  23. struct Library *DiskBase;
  24. struct Library *CiaBase;
  25. struct Library *TimerBase;
  26. BYTE signum;
  27. ULONG sigmask;
  28. struct Task *MyTask;
  29. extern struct ExecBase *SysBase;
  30. static struct MsgPort *port;
  31. struct EClockVal currenttime;
  32. ULONG TicsPerSecond;
  33.  
  34. /* for reference
  35. struct EClockVal {
  36.     ULONG ev_hi;
  37.     ULONG ev_lo;
  38. };
  39. */
  40.  
  41. static __saveds void IndexInt(void)
  42. {
  43.     TicsPerSecond=ReadEClock(¤ttime);
  44.     Signal(MyTask,sigmask);
  45. }
  46.  
  47. void main(void)
  48. {
  49.     static struct DiscResourceUnit diskunit; /* initialized to zero because of static */
  50.     volatile struct CIA *ciab=(void*)0xbfd000;
  51.     struct IORequest io;
  52.     struct EClockVal oldtime;
  53.     ULONG sigs;
  54.  
  55.     /* Handle command-line arguments */
  56.     rdargs=ReadArgs("DRIVE/N/A",args,0);
  57.     if (rdargs == 0) {
  58.         printf("Invalid parameters\n");
  59.         return;
  60.     }
  61.  
  62.     /* check whether the drive# is valid by opening trackdisk */
  63.     if (OpenDevice("trackdisk.device", *(int *)args[DRIVE], &io, TDF_ALLOW_NON_3_5)) {
  64.         printf("Could not open trackdisk unit %d\n",*(int *)args[DRIVE]);
  65.         FreeArgs(rdargs);
  66.         return;
  67.     }
  68.     CloseDevice(&io);
  69.  
  70.     if ((port = CreateMsgPort())==0) {
  71.         printf("Could not create message port (out of memory)\n");
  72.         FreeArgs(rdargs);
  73.         return;
  74.     }
  75.  
  76.     DiskBase=OpenResource("disk.resource");
  77.     CiaBase=OpenResource("ciab.resource");
  78.     signum=AllocSignal(-1);
  79.     if (signum==-1) {
  80.         printf("Can't allocate signal bit\n");
  81.         FreeArgs(rdargs);
  82.         return;
  83.     }
  84.     sigmask=1<<signum;
  85.     MyTask=SysBase->ThisTask;
  86.  
  87.     OpenDevice("timer.device", 0, &io, 0);
  88.     TimerBase=(struct Library*)io.io_Device;
  89.  
  90.     printf("Note: you must place a disk (may be write-protected) in unit %d\n",*(int *)args[DRIVE]);
  91.  
  92.     /* get disk.resource */
  93.     diskunit.dru_Index.is_Code=&IndexInt;
  94.     diskunit.dru_Index.is_Node.ln_Name="speed check index";
  95.     diskunit.dru_Message.mn_ReplyPort=port;
  96.     diskunit.dru_Message.mn_Node.ln_Name="speed check";
  97.     while (!GetUnit((struct DiskResourceUnit*)&diskunit)) {
  98.         WaitPort(port);
  99.         GetMsg(port); /* important! remove message */
  100.     }
  101.  
  102.     /* set up CIA bits, turn on motor, wait for motor */
  103.     ciab->ciaprb |= CIAF_DSKSEL0|CIAF_DSKSEL1|CIAF_DSKSEL2|CIAF_DSKSEL3;
  104.     ciab->ciaprb &= ~CIAF_DSKMOTOR;
  105.     ciab->ciaprb &= ~(1<<(*(int *)args[DRIVE]+3));
  106.  
  107.     /* enable index int */
  108.     SetICR(16); /* clear interrupt */
  109.     AbleICR(16+128); /* enable interrupt */
  110.  
  111.     sigs=Wait(sigmask | SIGBREAKF_CTRL_C);
  112.     if (sigs & SIGBREAKF_CTRL_C) goto ControlC;
  113.  
  114.     oldtime=currenttime;
  115.     while (1) {
  116.         double rpm;
  117.  
  118.         sigs=Wait(sigmask | SIGBREAKF_CTRL_C);
  119.         if (sigs & SIGBREAKF_CTRL_C) break;
  120.  
  121.         /* compute time difference (currenttime-oldtime) and print RPM */
  122.         if (currenttime.ev_hi==oldtime.ev_hi)
  123.             rpm = currenttime.ev_lo-oldtime.ev_lo;
  124.         else
  125.             rpm = (4294967296.0+currenttime.ev_lo)-oldtime.ev_lo;
  126.         oldtime=currenttime;
  127.         rpm = 60.0/(rpm/TicsPerSecond);
  128.         printf("RPM: %.3f\n",rpm);
  129.     }
  130.  
  131. ControlC:
  132.     /* motor off */
  133.     ciab->ciaprb |= CIAF_DSKSEL0|CIAF_DSKSEL1|CIAF_DSKSEL2|CIAF_DSKSEL3;
  134.     ciab->ciaprb |= CIAF_DSKMOTOR;
  135.     ciab->ciaprb &= ~(1<<(*(int *)args[DRIVE]+3));
  136.  
  137.     AbleICR(16); /* disable interrupt */
  138.     SetICR(16); /* clear interrupt */
  139.     GiveUnit();
  140.     CloseDevice(&io);
  141.     FreeSignal(signum);
  142.     FreeArgs(rdargs);
  143. }
  144.  
  145.